package com.qiangzhi.valid;

import com.qiangzhi.annotation.StringField;
import com.qiangzhi.constant.DefaultDataConstant;
import com.qiangzhi.constant.RegexConstant;
import com.qiangzhi.constant.StatusConstant;
import com.qiangzhi.enums.StringFieldType;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;
import java.util.List;

/**
 * StringField注解具体校验逻辑的实现类
 */
public class StringFieldValid implements ConstraintValidator<StringField, String> {

    // 静态集合 集合中存放了所有身份参数用于校验
    static List<String> identifyList = Arrays.asList(
            StatusConstant.STUDENT,
            StatusConstant.COLLEGE,
            StatusConstant.MAJOR,
            StatusConstant.TEACHER,
            StatusConstant.ADMIN);

    private StringFieldType fieldType; // 字段类型
    private boolean isEmpty; // 是否可以为空

    /**
     * 获取到使用注解时设置的约束
     *
     * @param constraintAnnotation 可以获取到注解设置的约束
     */
    @Override
    public void initialize(StringField constraintAnnotation) {
        this.fieldType = constraintAnnotation.type();
        this.isEmpty = constraintAnnotation.empty();
    }

    /**
     * 具体校验逻辑
     *
     * @param field                      需要检验的字段
     * @param constraintValidatorContext 校验结果的提示信息 使用注解时已经指明了错误提示信息 一般不需要使用
     * @return 校验成功或失败
     */
    @Override
    public boolean isValid(String field, ConstraintValidatorContext constraintValidatorContext) {
        // 参数可以为空 进行空字符串校验
        if (isEmpty) {
            // 空字符串校验
            return DefaultDataConstant.DEFAULT_EMPTY_STRING.equals(field) || field.isEmpty();
        }

        // 密码参数校验
        if (fieldType == StringFieldType.PASSWORD) return field.matches(RegexConstant.PASSWORD_REGEX);

        // 身份参数校验
        if (fieldType == StringFieldType.IDENTIFY) return identifyList.contains(field);

        // 手机号参数校验
        if (fieldType == StringFieldType.PHONE) return field.matches(RegexConstant.PHONE_REGEX);

        // 身份证号参数校验
        if (fieldType == StringFieldType.CARD) {
            // 身份证号分为15位和18位
            return field.matches(RegexConstant.SHORT_CARD_REGEX) || field.matches(RegexConstant.LONG_CARD_REGEX);
        }

        // 居住地址参数校验
        if (fieldType == StringFieldType.ADDRESS) return field.matches(RegexConstant.ADDRESS_REGEX);

        return false;
    }

}
